#include "IndiceSecuencial.h"
#include <stdexcept>
#include <cstring>

IndiceSecuencial::IndiceSecuencial(const char* path) : path(path),
	archivo(path, ios::in | ios::out | ios::binary )
{
	if(!archivo.is_open())
	{
		archivo.open(path, ios::out | ios::binary);
		archivo.close();
		archivo.open(path, ios::in | ios::out | ios::binary );
		if (!archivo.is_open()) throw std::ios_base::failure("No pudo ni accederse ni crearse el archivo Indice.");
	}
}

void IndiceSecuencial::recrearArchivo()
{
	archivo.close();
	archivo.open(path.c_str(), ios::in | ios::out | ios::trunc | ios::binary );
	if(!archivo.is_open())
	{
		throw std::ios_base::failure("No recrearse el archivo Indice.");
	}
}

IndiceSecuencial::~IndiceSecuencial()
{
	archivo.close();
}

size_t IndiceSecuencial::agregar(size_t referencia)
{
	archivo.seekp(0,ios::end);
	size_t id = archivo.tellp() / BYTES_POS;
	char bytes[BYTES_POS];
	memcpy(bytes, &referencia, BYTES_POS);
	archivo.write(bytes, BYTES_POS);
	return id;
}

size_t IndiceSecuencial::devolver(size_t id)
{
	char bytes[BYTES_POS];
	archivo.seekg(id*BYTES_POS, ios::beg);
	archivo.read(bytes, BYTES_POS);
	size_t val;
	memcpy(&val, bytes, BYTES_POS);
	return val;
}
